import runtimeType from './runtimeType.js';

/**
 * node节点信息获取【异步方法】
 * @description node节点信息获取，获取成功后，以回调函数参数方式返回
 * @param {Object} that 页面page对象实例this
 * @param {String} el 类似于CSS的选择器，如：#id
 * @param {Function} callback 成功回调函数
 */
function nodeInfo(that = {}, el = '', callback) {
	
	// 初始化返回数据，数值单位：px
	var data_back = {
		width: 0, // 节点的宽度
		height: 0, // 节点的高度
		left: 0, // 节点的左边界坐标
		top: 0, // 节点的上边界坐标
		right: 0, // 节点的右边界坐标
		bottom: 0, // 节点的下边界坐标
		scrollTop: 0, // 节点的竖直滚动位置
		scrollLeft: 0, // 节点的水平滚动位置
	};
	
	// 查询页面外层window
	if (el == "window" || el == "html" || el == "body" || el == "page")
	{
        // 获取当前运行环境
        var runType = runtimeType();
        // 如果是“非UNI”环境
        if (runType == 'nonUNI')
        {
            // 信息数据 赋值
            data_back.width = Math.round(document.documentElement.scrollWidth || document.body.scrollWidth);
            data_back.height = Math.round(document.documentElement.scrollHeight || document.body.scrollHeight);
            data_back.top = 0;
            data_back.bottom = 0;
            data_back.left = 0;
            data_back.right = 0;
            data_back.scrollTop =  Math.round(document.documentElement.scrollTop || document.body.scrollTop);
            data_back.scrollLeft = Math.round(document.documentElement.scrollLeft || document.body.scrollLeft);
            // 数据获取成功 回调函数
            if (callback) { callback(data_back); }
        }
        // 如果是UNI环境
        else {
            // "屏幕外层"节点信息对象
            const dom_page = uni.createSelectorQuery().selectViewport();
            // 获取节点布局信息
            dom_page.fields({
            	size: true,
            	rect: true,
            	scrollOffset: true,
            }, (res) => {
            	// 信息数据 赋值
            	data_back.width = Math.round(res.width);
            	data_back.height = Math.round(res.height);
            	data_back.top = Math.round(res.top);
            	data_back.bottom = Math.round(res.bottom);
            	data_back.left = Math.round(res.left);
            	data_back.right = Math.round(res.right);
            	data_back.scrollTop = res.scrollTop ? Math.round(res.scrollTop) : 0;
            	data_back.scrollLeft = res.scrollLeft ? Math.round(res.scrollLeft) : 0;
            	// 数据获取成功 回调函数
            	if (callback) { callback(data_back); }
            }).exec();
        }
	}
	
	// 查询页面组件
	else {
        // 获取当前运行环境
        var runType = runtimeType();
        // 如果是“非UNI”环境
        if (runType == 'nonUNI')
        {
            // 初始化要搜索的dom对象
            var obj_dom = null;
            // 传进了id名字
            if (el.indexOf("#") == 0) 
            {
                // 取出#后面的字符串
            	var str_after = el.slice(1);
                // 用id搜索器
            	obj_dom = document.getElementById(str_after);
            }
            // 传进了class名字
            else if (el.indexOf(".") == 0) 
            {
                // 取出.后面的字符串
            	var str_after = el.slice(1);
                // 用class类名搜索器
            	var arr_dom = document.getElementsByClassName(str_after);
                // 取出搜索项的第一个
            	if (arr_dom && arr_dom.length > 0) { obj_dom = arr_dom[0]; }
            }
            // 就是标签名
            else {
                // 使用标签搜索器
            	var arr_dom = document.getElementsByTagName(el);
                // 取出搜索项的第一个
            	if (arr_dom && arr_dom.length > 0) { obj_dom = arr_dom[0]; }
            }
            // 信息数据 赋值
            data_back.width = Math.round(obj_dom.offsetWidth);
            data_back.height = Math.round(obj_dom.offsetHeight);
            data_back.top = Math.round(obj_dom.offsetTop);
            data_back.bottom = 0;
            data_back.left = Math.round(obj_dom.offsetLeft);
            data_back.right = 0;
            data_back.scrollTop =  Math.round(obj_dom.scrollTop);
            data_back.scrollLeft = Math.round(obj_dom.scrollLeft);
            // 数据获取成功 回调函数
            if (callback) { callback(data_back); }
        }
        // 如果是UNI环境
        else {
            // "要查询节点"的节点信息对象
            const dom_view = uni.createSelectorQuery().in(that).select(el);
            // 具体节点信息
            dom_view.fields({
            	size: true,
            	rect: true,
            	scrollOffset: true,
            }, (res) => {
            	// 信息数据 赋值
            	data_back.width = Math.round(res.width);
            	data_back.height = Math.round(res.height);
            	data_back.top = Math.round(res.top);
            	data_back.bottom = Math.round(res.bottom);
            	data_back.left = Math.round(res.left);
            	data_back.right = Math.round(res.right);
            	data_back.scrollTop = res.scrollTop ? Math.round(res.scrollTop) : 0;
            	data_back.scrollLeft = res.scrollLeft ? Math.round(res.scrollLeft) : 0;
            	// 数据获取成功 回调函数
            	if (callback) { callback(data_back); }
            }).exec();
        }
	}
	
}

export default nodeInfo;